#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN=1e4+23;
char mu[MAXN], zi[MAXN];
int prime[MAXN], p_cnt;
bool isP[MAXN];
int e1[MAXN], e2[MAXN];
void Init() {
	memset(isP, 1, sizeof(isP));
	p_cnt=0;
	for (int i=2; i<MAXN; ++i) {
		if (isP[i]) prime[p_cnt++]=i;
		for (int j=0; j<p_cnt&&i*prime[j]<MAXN; ++j) {
			isP[i*prime[j]]=false;
			if (i%prime[j]==0) break;
		}
	}
}
void mySort(int& a, int& b, int&c) {
	if (a>b) swap(a,b);
	if (b>c) swap(b,c);
	if (a>b) swap(a,b);
}
void myMemset(char* s, int a, int b, int c) {
	for (int i=1; i<=c; ++i) {
		if (i<=a) s[i]=3;
		if (i>a&&i<=b) s[i]=2;
		if (i>b&&i<=c) s[i]=1;
	}
}
int main(int argc, char** argv) {
	#ifdef hai
	freopen("in.txt", "r", stdin);
	#endif
	Init();
	int p,q,r,s;
	while (~scanf("%d %d %d %d", &p, &q, &r, &s)) {
		int a1=p, b1=r-s, c1=s;
		int a2=q, b2=p-q, c2=r;
		mySort(a1,b1,c1);
		mySort(a2,b2,c2);
//		printf("1: %d %d %d\n", a1, b1, c1);
//		printf("2: %d %d %d\n", a2, b2, c2);
		int len=max(c1,c2);
		memset(mu, 0, sizeof(char)*(len+23));
		memset(zi, 0, sizeof(char)*(len+23));
		memset(e1, 0, sizeof(int)*p_cnt);
		memset(e2, 0, sizeof(int)*p_cnt);
		myMemset(mu,a1,b1,c1);
		myMemset(zi,a2,b2,c2);
		for (int i=1; i<=len; ++i) {
			int m=min(mu[i], zi[i]);
			mu[i] -= m;
			zi[i] -= m;
			if (mu[i]!=0) {
				int ask=i;
				for (int j=0; j<p_cnt&&ask!=1; ++j) {
					int t=0;
					while (ask%prime[j]==0) {
						++t;
						ask/=prime[j];
					}
					e1[j]+=mu[i]*t;
				}
			}
			if (zi[i]!=0) {
				int ask=i;
				for (int j=0; j<p_cnt&&ask!=1; ++j) {
					int t=0;
					while (ask%prime[j]==0) {
						++t;
						ask/=prime[j];
					}
					e2[j]+=zi[i]*t;
				}
			}
		}
		double res=1.0;
		for (int i=0; i<p_cnt; ++i) {
			int m=min(e1[i], e2[i]);
			e1[i]-=m;
			e2[i]-=m;
			if (e1[i]!=0) {
				res*=pow(prime[i], e1[i]);
			}
			if (e2[i]!=0) {
				res/=pow(prime[i], e2[i]);
			}
		}
		printf("%0.5lf\n", res);
	}
	return 0;
}
